﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using log4net;
using GS1.Utilitario;
using SegIdenPC.Herramientas;
using SegIdenPC.Entidad;

namespace SegIdenPC.Formularios
{
    public partial class frmMantTransporte : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantTransporte));

        private const string TITULO = "Mantenimiento de Transportes";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total transporte encontrados: {0}";

        private const string RUC = "RUC";
        private const string RAZONSOCIAL = "Razón Social";
        private string ESTADO = string.Empty;

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Cancelar = 4,
            Eliminar = 5
        }

        public Transporte transporteActual { get; set; }

        public bool formularioBusqueda { get; set; }
        #endregion

        #region --- Constructor ---
        public frmMantTransporte()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---
        private void frmMantTransporte_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }

        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            nuevo();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            editar();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            grabar();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            cancelar();
        }

        private void tbtnEliminar_Click(object sender, EventArgs e)
        {
            eliminar();
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            buscar();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }

        private void btnAgregarVehiculo_Click(object sender, EventArgs e)
        {
            agregarVehiculo();
        }

        private void btnEliminarVehiculo_Click(object sender, EventArgs e)
        {
            quitarVehiculo();
        }

        private void btnAgregarConductor_Click(object sender, EventArgs e)
        {
            agregarConductor();
        }

        private void btnEliminarConductor_Click(object sender, EventArgs e)
        {
            quitarConductor();
        }

        private void dgvListado_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarTransporte();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { buscar(); }
        }

        private void dgvListadoVehiculos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarVehiculos();
        }

        private void dgvListadoConductores_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            seleccionarConductores();
        }

        #endregion

        #region --- Metodos Propios ---
        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();

                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_ACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_ACTIVO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_CODIGO_INACTIVO, descripcion = Constantes.ESTADO_DESCRIPCION_INACTIVO });
  
                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;

                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo parametros del Combo Criterio
                this.cboCriterio.Items.Add(RUC);
                this.cboCriterio.Items.Add(RAZONSOCIAL);
                this.cboCriterio.SelectedIndex = 0;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;
                
                // Estableciendo focus
                this.txtCriterio.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void finalizarFormulario()
        {
            this.tabControl.Selecting -= new TabControlCancelEventHandler(tabControl_Selecting);
        }

        private void pintarGrilla()
        {
            ListPersonalizada<Transporte> listaTransportes = null;
            listaTransportes = (ListPersonalizada<Transporte>)this.dgvListado.DataSource;

            if (listaTransportes != null)
            {
                for (int i = 0; i < listaTransportes.Count; i++)
                {
                    var transporte = listaTransportes[i];

                    transporte.estado = transporte.estado.Equals(Constantes.ESTADO_CODIGO_INACTIVO) ? Constantes.ESTADO_DESCRIPCION_INACTIVO : Constantes.ESTADO_DESCRIPCION_ACTIVO;

                    if (transporte.estado == Constantes.ESTADO_DESCRIPCION_INACTIVO)
                    {
                        this.dgvListado.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(255, 128, 128);
                    }
                }
            }
        }

        private bool validarEntradaBusqueda()
        {
            this.txtCriterio.Text = this.txtCriterio.Text.Trim();
            if (this.txtCriterio.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar el valor de busqueda");
                return true;
            }

            if (this.txtCriterio.TextLength < 3)
            {
                Libreria.CampoNecesario(this.txtCriterio, "Debe ingresar por lo menos 3 caracteres para realizar la busqueda");
                return true;
            }

            return false;
        }

        private void listarTransportes(string criterio,
                                       string valor)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_TRANSPORTES;

            operacion.transporte = new Transporte();
            operacion.transporte.ruc = string.Empty;
            operacion.transporte.razonSocial = string.Empty;
            operacion.transporte.estado = this.ESTADO;

            switch (criterio)
            {
                case RUC:
                    operacion.transporte.ruc = valor;
                    break;
                case RAZONSOCIAL:
                    operacion.transporte.razonSocial = valor;
                    break;
            }

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaTransporte
            ListaTransporte listaTransporte = contenidoXML.DeserializarTo<ListaTransporte>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaTransporte.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListado.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListado.DataSource = listaTransporte.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaTransporte.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla();
        }

        private void buscar()
        {
            try
            {
                if (validarEntradaBusqueda()) { return; }

                // Listar clientes con el criterio y el valor ingresado
                listarTransportes(this.cboCriterio.Text, this.txtCriterio.Text);

                // Estableciendo focus al caja de texto de busqueda
                this.txtCriterio.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void nuevo()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Nuevo);

            // Limpiar los datos del formulario
            limpiarTodo();

            this.tipoOperacion = OperacionMantenimiento.Nuevo;

            // Estableciendo focus al texto ruc
            this.txtRuc.Focus();
        }

        private void editar()
        {
            this.grpDatos.Enabled = true;
            this.cboEstado.Enabled = true;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Editar);

            this.tipoOperacion = OperacionMantenimiento.Editar;

            // Estableciendo focus al texto ruc
            this.txtRuc.Focus();
        }

        private void abrir()
        {
            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false; this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
            {
                ListPersonalizada<Transporte> listaTransporte = (ListPersonalizada<Transporte>)this.dgvListado.DataSource;
                this.transporteActual = listaTransporte[this.dgvListado.CurrentRow.Index];

                this.txtRuc.Text = this.transporteActual.ruc;
                this.txtRazonSocial.Text = this.transporteActual.razonSocial;
                this.cboEstado.Text = this.transporteActual.estado;

                // Cargar vehiculos y conductores del transporte
                abrir_vehiculosYconductores(this.transporteActual.codTransporte);
            }
        }

        private void abrir_vehiculosYconductores(string codigoTransporte)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_TRANSPORTE;
            operacion.transporte = new Transporte { codTransporte = codigoTransporte };

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de Transporte
            Transporte transporte = contenidoXML.DeserializarTo<Transporte>();

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoVehiculos.AutoGenerateColumns = false;

            this.dgvListadoVehiculos.DataSource = transporte.listaVehiculoTransporte.lista == null ?
                                                    new ListPersonalizada<VehiculoTransporte>() :
                                                    transporte.listaVehiculoTransporte.lista;

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoConductores.AutoGenerateColumns = false;

            this.dgvListadoConductores.DataSource = transporte.listaConductorTransporte.lista == null ?
                                                    new ListPersonalizada<ConductorTransporte>() :
                                                    transporte.listaConductorTransporte.lista;
        }

        private void cancelar()
        {
            if ((this.tipoOperacion == OperacionMantenimiento.Editar) ||
                 (!this.grpDatos.Enabled))
            {
                this.cboCriterio.Text = RUC;
                this.txtCriterio.Text = this.txtRuc.Text;
            }

            if (!this.txtCriterio.Text.Equals(string.Empty))
            {
                // Refrescar grilla
                listarTransportes(this.cboCriterio.Text, this.txtCriterio.Text);
            }

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

            // Mostrar la primera pagina del TabControl
            this.tabControl.SelectedIndex = 0;

            // Deshabilitando el grupoBox de datos
            this.grpDatos.Enabled = false;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Cancelar);

            // Estableciendo focus al caja de texto de busqueda
            this.txtCriterio.Focus();
        }

        private void grabar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                if (validarEntrada()) { return; }

                // Solicitar confirmacion
                if (!Libreria.ShowMessageboxPregunta((this.tipoOperacion == OperacionMantenimiento.Nuevo ?
                                                                            "¿Estas seguro de registrar el transporte?" :
                                                                            "¿Estas seguro de modificar el transporte actual?"), TITULO)) { return; }


                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.OPERACION_REGISTRAR_TRANSPORTE : Constantes.OPERACION_MODIFICAR_TRANSPORTE;

                operacion.transporte = new Transporte();
                operacion.transporte.codTransporte = this.tipoOperacion == OperacionMantenimiento.Nuevo ? Constantes.VALOR_CERO : this.transporteActual.codTransporte;
                operacion.transporte.ruc = this.txtRuc.Text;
                operacion.transporte.razonSocial = this.txtRazonSocial.Text;
                operacion.transporte.estado = this.cboEstado.SelectedValue.ToString();
                operacion.transporte.fechaRegistro = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                operacion.transporte.listaVehiculoTransporte = new ListaVehiculoTransporte();
                operacion.transporte.listaVehiculoTransporte.lista = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;

                operacion.transporte.listaConductorTransporte = new ListaConductorTransporte();
                operacion.transporte.listaConductorTransporte.lista = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                string mensajeOK = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "Registro guardado correctamente" : "Datos modificado correctamente";
                string mensajeError = this.tipoOperacion == OperacionMantenimiento.Nuevo ? "No se guardo los datos" : "No se actualizo los datos";


                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo(mensajeOK, TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError(mensajeError, TITULO);
                    return;
                }

                this.grpDatos.Enabled = false;

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Grabar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void eliminar()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                // Solicitar confirmacion para eliminar el cliente
                if (!Libreria.ShowMessageboxPregunta("¿Esta seguro de eliminar a este Transporte?", TITULO)) { return; }

                // Estableciendo operacion a ser enviada al Servicio REST
                operacion = new Operacion();
                operacion.numero = Constantes.OPERACION_ELIMINAR_TRANSPORTE;

                operacion.transporte = new Transporte { codTransporte = this.transporteActual.codTransporte };

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    Libreria.ShowMessageboxInfo("Registro eliminado correctamente", TITULO);
                }
                else
                {
                    Libreria.ShowMessageboxError("No se elimino el Registro", TITULO);
                    return;
                }

                // Estableciendo estado de TagPage de Listado y datos
                this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                // Mostrar la primera pagina del TabControl
                this.tabControl.SelectedIndex = 0;

                this.grpDatos.Enabled = false;

                listarTransportes(string.Empty, string.Empty);

                // Estableciendo los estados de los botones
                cambiarEstadoBotones(Opcion.Eliminar);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarEntrada()
        {
            bool resultado = false;

            this.txtRuc.Text = this.txtRuc.Text.Trim();
            this.txtRazonSocial.Text = this.txtRazonSocial.Text.Trim();

            if (this.txtRuc.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtRuc, "Debe ingresar el campo RUC", TITULO);
                return true;
            }

            if (this.txtRazonSocial.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtRazonSocial, "Debe ingresar el campo Razón Social", TITULO);
                return true;
            }

            return resultado;
        }

        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;

                    this.tbtnAbrir.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;

                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;

                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnEliminar.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEliminar.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = true;

                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    //this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Eliminar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;

                    this.tbtnEliminar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
            }
        }

        private void limpiarTodo()
        {
            this.txtRuc.Text = string.Empty;
            this.txtRazonSocial.Text = string.Empty;
            this.cboEstado.Text = Constantes.ESTADO_DESCRIPCION_ACTIVO;

            limpiarVehiculo();

            limpiarConductor();

            ListPersonalizada<VehiculoTransporte> listaVehiculoTransporte = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;

            if (listaVehiculoTransporte != null)
            {
                listaVehiculoTransporte.Clear();

                this.dgvListadoVehiculos.DataSource = null;
                this.dgvListadoVehiculos.DataSource = listaVehiculoTransporte;
            }

            ListPersonalizada<ConductorTransporte> listaConductorTransporte = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;

            if (listaConductorTransporte != null)
            {
                listaConductorTransporte.Clear();

                this.dgvListadoConductores.DataSource = null;
                this.dgvListadoConductores.DataSource = listaConductorTransporte;
            }
        }

        private void limpiarVehiculo()
        {
            this.txtVehiculoPlaca.Text = string.Empty;
            this.txtVehiculoModelo.Text = string.Empty;
            this.txtVehiculoMarca.Text = string.Empty;
        }

        private void limpiarConductor()
        {
            this.txtConductorNombresyApellidos.Text = string.Empty;
            this.txtConductorNroLicencia.Text = string.Empty;
            this.txtConductorDni.Text = string.Empty;
        }

        private bool validarEntradaVehiculo()
        {
            bool resultado = false;

            this.txtVehiculoPlaca.Text = this.txtVehiculoPlaca.Text.Trim();
            this.txtVehiculoModelo.Text = this.txtVehiculoModelo.Text.Trim();
            this.txtVehiculoMarca.Text = this.txtVehiculoMarca.Text.Trim();

            if (this.txtVehiculoPlaca.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtVehiculoPlaca, "Debe ingresar el campo Placa del vehiculo", TITULO);
                return true;
            }

            //if (this.txtVehiculoModelo.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtVehiculoModelo, "Debe ingresar el campo Modelo del vehiculo", TITULO);
            //    return true;
            //}

            if (this.txtVehiculoMarca.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtVehiculoMarca, "Debe ingresar el campo Marca del vehiculo", TITULO);
                return true;
            }

            return resultado;
        }

        private void seleccionarVehiculos()
        {
            // Valida si seleccione algun Vehiculos
            if (this.dgvListadoVehiculos.CurrentRow != null && this.dgvListadoVehiculos.CurrentRow.Index > -1)
            {
                // Obteniendo lista de contactos
                ListPersonalizada<VehiculoTransporte> listaVehiculoTransporte = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;
                VehiculoTransporte VehiculoTransporteActual = new VehiculoTransporte();
                VehiculoTransporteActual = listaVehiculoTransporte[this.dgvListadoVehiculos.CurrentRow.Index];

                //Cargar datos
                this.txtVehiculoPlaca.Text = VehiculoTransporteActual.placa;
                this.txtVehiculoModelo.Text = VehiculoTransporteActual.modelo;
                this.txtVehiculoMarca.Text = VehiculoTransporteActual.marca;
            }
        }


        private void seleccionarConductores()
        {
            // Valida si seleccione algun Conductor
            if (this.dgvListadoConductores.CurrentRow != null && this.dgvListadoConductores.CurrentRow.Index > -1)
            {
                // Obteniendo lista de conductores
                ListPersonalizada<ConductorTransporte> listaConductorTransporte = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;
                ConductorTransporte ConductorTransporteActual = new ConductorTransporte();
                ConductorTransporteActual = listaConductorTransporte[this.dgvListadoConductores.CurrentRow.Index];

                //Cargar datos
                this.txtConductorNombresyApellidos.Text = ConductorTransporteActual.nombresyApellidos;
                this.txtConductorNroLicencia.Text = ConductorTransporteActual.licencia;
                this.txtConductorDni.Text = ConductorTransporteActual.dni;
            }
        }

        private void agregarVehiculo()
        {
            try
            {
                if (validarEntradaVehiculo()) { return; }

                
                // Obteniendo lista de vehiculos
                ListPersonalizada<VehiculoTransporte> listaVehiculoTransporte = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;
                if (listaVehiculoTransporte == null) { listaVehiculoTransporte = new ListPersonalizada<VehiculoTransporte>(); }

                // Instanciando vehiculo
                VehiculoTransporte vehiculoTransporte = new VehiculoTransporte();
                vehiculoTransporte.placa = this.txtVehiculoPlaca.Text;
                vehiculoTransporte.modelo = this.txtVehiculoModelo.Text;
                vehiculoTransporte.marca = this.txtVehiculoMarca.Text;

                if (validarVehiculoRepetido(this.txtVehiculoPlaca.Text))
                {
                    //Libreria.CampoNecesario(this.txtVehiculoPlaca, "Este vehiculo ya se encuentra asociado al transporte", TITULO);
                    //return;
                    ListPersonalizada<VehiculoTransporte> listaVehiculoTransportenuevo = new ListPersonalizada<VehiculoTransporte>();

                    if (listaVehiculoTransporte != null)
                    {
                        foreach (VehiculoTransporte item in listaVehiculoTransporte)
                        {
                            if (item.placa.Equals(this.txtVehiculoPlaca.Text)) { }
                            else
                            {
                                listaVehiculoTransportenuevo.Add(item);
                            }
                        }
                        listaVehiculoTransporte = listaVehiculoTransportenuevo;
                    }
                }


                // Agregando vehiculo
                listaVehiculoTransporte.Add(vehiculoTransporte);

                // Actualizando en grilla
                this.dgvListadoVehiculos.DataSource = null;
                this.dgvListadoVehiculos.DataSource = listaVehiculoTransporte;

                // Limpiando campos del vehiculo
                limpiarVehiculo();

                // Estableciendo focus
                this.txtVehiculoPlaca.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarVehiculo()
        {
            try
            {
                // Obteniendo lista de vehiculos
                ListPersonalizada<VehiculoTransporte> listaVehiculoTransporte = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;

                if (listaVehiculoTransporte != null && listaVehiculoTransporte.Count > 0)
                {
                    // Obteniedo contacto seleccionado
                    VehiculoTransporte vehiculoTransporte = listaVehiculoTransporte[this.dgvListadoVehiculos.CurrentRow.Index];

                    // Eliminando vehiculo
                    listaVehiculoTransporte.Remove(vehiculoTransporte);

                    // Actualizando en grilla
                    this.dgvListadoVehiculos.DataSource = null;
                    this.dgvListadoVehiculos.DataSource = listaVehiculoTransporte;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarVehiculoRepetido(string placa)
        {
            bool resultato = false;

            // Obteniendo lista de contactos
            ListPersonalizada<VehiculoTransporte> listaVehiculoTransporte = (ListPersonalizada<VehiculoTransporte>)this.dgvListadoVehiculos.DataSource;

            if (listaVehiculoTransporte != null)
            {
                foreach (VehiculoTransporte item in listaVehiculoTransporte)
                {
                    if (item.placa.Equals(placa))
                    {
                        resultato = true;
                        break;
                    }
                }
            }
            return resultato;
        }

        private bool validarEntradaConductor()
        {
            bool resultado = false;

            this.txtConductorNombresyApellidos.Text = this.txtConductorNombresyApellidos.Text.Trim();
            this.txtConductorNroLicencia.Text = this.txtConductorNroLicencia.Text.Trim();
            this.txtConductorDni.Text = this.txtConductorDni.Text.Trim();

            if (this.txtConductorNombresyApellidos.Text.Equals(string.Empty))
            {
                Libreria.CampoNecesario(this.txtConductorNombresyApellidos, "Debe ingresar el campo Nombres y apellidos del conductor", TITULO);
                return true;
            }

            //if (this.txtConductorNroLicencia.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtConductorNroLicencia, "Debe ingresar el campo Nº Licencia del conductor", TITULO);
            //    return true;
            //}

            //if (this.txtConductorDni.Text.Equals(string.Empty))
            //{
            //    Libreria.CampoNecesario(this.txtConductorDni, "Debe ingresar el campo DNI del conductor", TITULO);
            //    return true;
            //}

            return resultado;
        }

        private void agregarConductor()
        {
            try
            {
                if (validarEntradaConductor()) { return; }

                // Obteniendo lista de conductores
                ListPersonalizada<ConductorTransporte> listaConductorTransporte = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;
                if (listaConductorTransporte == null) { listaConductorTransporte = new ListPersonalizada<ConductorTransporte>(); }

                // Instanciando conductor
                ConductorTransporte conductorTransporte = new ConductorTransporte();
                conductorTransporte.nombresyApellidos = this.txtConductorNombresyApellidos.Text;
                conductorTransporte.licencia = this.txtConductorNroLicencia.Text;
                conductorTransporte.dni = this.txtConductorDni.Text;

                if (validarConductorRepetido(this.txtConductorNombresyApellidos.Text))
                {
                    //Libreria.CampoNecesario(this.txtConductorNombresyApellidos, "Este conductor ya se encuentra asociado al transporte", TITULO);
                    //return;

                    ListPersonalizada<ConductorTransporte> listaConductorTransportenuevo = new ListPersonalizada<ConductorTransporte>();

                    if (listaConductorTransporte != null)
                    {
                        foreach (ConductorTransporte item in listaConductorTransporte)
                        {
                            if (item.nombresyApellidos.Equals(this.txtConductorNombresyApellidos.Text)) { }
                            else
                            {
                                listaConductorTransportenuevo.Add(item);
                            }
                        }
                        listaConductorTransporte = listaConductorTransportenuevo;
                    }
                }


                // Agregando conductor
                listaConductorTransporte.Add(conductorTransporte);

                // Actualizando en grilla
                this.dgvListadoConductores.DataSource = null;
                this.dgvListadoConductores.DataSource = listaConductorTransporte;

                // Limpiando campos del conductor
                limpiarConductor();

                // Estableciendo focus
                this.txtConductorNombresyApellidos.Focus();
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private void quitarConductor()
        {
            try
            {
                // Obteniendo lista de conductores
                ListPersonalizada<ConductorTransporte> listaConductorTransporte = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;

                if (listaConductorTransporte != null && listaConductorTransporte.Count > 0)
                {
                    // Obteniedo contacto seleccionado
                    ConductorTransporte conductprTrasporte = listaConductorTransporte[this.dgvListadoConductores.CurrentRow.Index];

                    // Eliminando conductor
                    listaConductorTransporte.Remove(conductprTrasporte);

                    // Actualizando en grilla
                    this.dgvListadoConductores.DataSource = null;
                    this.dgvListadoConductores.DataSource = listaConductorTransporte;
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }

        private bool validarConductorRepetido(string nombresyApellidos)
        {
            bool resultato = false;

            // Obteniendo lista de vehiculos
            ListPersonalizada<ConductorTransporte> listaConductorProveedor = (ListPersonalizada<ConductorTransporte>)this.dgvListadoConductores.DataSource;

            if (listaConductorProveedor != null)
            {
                foreach (ConductorTransporte item in listaConductorProveedor)
                {
                    if (item.nombresyApellidos.Equals(nombresyApellidos))
                    {
                        resultato = true;
                        break;
                    }
                }
            }

            return resultato;
        }

        private void seleccionarTransporte()
        {
            if (this.formularioBusqueda)
            {
                // Valida si seleccione algun transporte
                if (this.dgvListado.CurrentRow != null && this.dgvListado.CurrentRow.Index > -1)
                {
                    ListPersonalizada<Transporte> listaTransporte = (ListPersonalizada<Transporte>)this.dgvListado.DataSource;
                    this.transporteActual = listaTransporte[this.dgvListado.CurrentRow.Index];

                    this.DialogResult = DialogResult.OK;
                }
            }
        }

        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;

            this.ESTADO = Constantes.ESTADO_CODIGO_ACTIVO;
        }

        private void salir()
        {
            if (this.formularioBusqueda)
            {
                this.DialogResult = DialogResult.Cancel;
            }
            else
            {
                this.Close();
            }
        }
        #endregion




    }
}
